package com.tps.cloud.system.service.impl;

import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.annotations.VisibleForTesting;
import com.tps.cloud.exception.BusinessException;
import com.tps.cloud.system.dto.SystemMenuDto;
import com.tps.cloud.system.entity.SystemDict;
import com.tps.cloud.system.entity.SystemDictItem;
import com.tps.cloud.system.entity.SystemMenu;
import com.tps.cloud.system.mapper.SystemMenuMapper;
import com.tps.cloud.system.service.SystemMenuService;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.stereotype.Service;

/**
 * 用户管理 服务实现类
 */
@Service
@AllArgsConstructor
public class SystemMenuServiceImpl extends ServiceImpl<SystemMenuMapper, SystemMenu> implements SystemMenuService {

    private final MessageSourceAccessor messages;

    @Override
    public Long createMenu(SystemMenuDto systemMenuDto) {
        //验证同一级别菜单名称不能相同
        validateMenu(systemMenuDto);
        SystemMenu systemMenu = new SystemMenu();
        BeanUtils.copyProperties(systemMenuDto, systemMenu);
        this.save(systemMenu);
        return systemMenu.getId();
    }

    /**
     * 查询某一级别下菜单是否存在相同
     * @param systemMenuDto
     */
    @VisibleForTesting
    void validateMenu(SystemMenuDto systemMenuDto) {
        SystemMenu systemMenu = baseMapper.selectOne(SystemMenu::getParentId, systemMenuDto.getParentId(),SystemMenu::getName, systemMenuDto.getName());
        if (systemMenu == null
                || ObjUtil.equal(systemMenu.getId(), systemMenuDto.getId())) {
            return;
        }
        throw new BusinessException(messages.getMessage("SystemMenuDto.Name.Exist"));
    }
}
